package com.example.student_manager_backend.entity;

import com.example.student_manager_backend.status.StudentStatus;
import jakarta.persistence.*;
import lombok.Data;
import lombok.Getter;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

/**
 * 学生实体类
 * 用于存储学生的基本信息，包括学号、姓名、性别、生日等
 */
@Data
@Entity
@Table(name = "student")
public class Student {
    /**
     * 学号，作为主键
     * 长度限制为20个字符
     */
    @Id
    @Column(length = 20)
    private String studentId;

    /**
     * 学生姓名
     * 不允许为空，最大长度50个字符
     */
    @Column(nullable = false, length = 50)
    private String name;

    /**
     * 性别
     * 长度限制为2个字符，如"男"、"女"
     */
    @Column(length = 2)
    private String gender;

    /**
     * 出生日期
     */
    @Temporal(TemporalType.DATE)
    private Date birthday;

    /**
     * 班级ID
     * 长度限制为20个字符
     */
    @Column(length = 20)
    private String classId;

    /**
     * 联系电话
     * 长度限制为11个字符
     */
    @Column(length = 11)
    private String phone;

    /**
     * 电子邮箱
     * 长度限制为100个字符
     */
    @Column(length = 100)
    private String email;

    /**
     * 学生状态
     * 使用枚举类型，默认为ACTIVE（在读）
     */
    @Enumerated(EnumType.STRING)
    @Column(length = 20)
    private StudentStatus status = StudentStatus.ACTIVE;

    /**
     * 创建时间
     * 使用时间戳类型
     */
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;

    /**
     * 更新时间
     * 使用时间戳类型
     */
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;

    @PrePersist
    protected void onCreate() {
        createTime = new Date();
        updateTime = new Date();
    }

    @PreUpdate
    protected void onUpdate() {
        updateTime = new Date();
    }

    // 获取已选课程集合
    /** 多对多关联：学生选修的课程（双向关联） */
    @Getter
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "students")
    private Set<Course> courses = new HashSet<>();

    // 业务方法：添加课程
    public void addCourse(Course course) {
        courses.add(course);
        course.addStudent(this); // 调用课程的 addStudent 方法
    }

    // 业务方法：移除课程
    public void removeCourse(Course course) {
        courses.remove(course);
        course.removeStudent(this); // 调用课程的 removeStudent 方法
    }

}